package com.yic.module.mes.service.report;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;
import com.yic.module.mes.controller.admin.report.vo.*;
import com.yic.module.mes.dal.dataobject.report.ReportDO;
import com.yic.framework.common.pojo.PageResult;

/**
 * 生产报工 Service 接口
 *
 * @author 系统管理员
 */
public interface ReportService {

    /**
     * 创建生产报工
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    void createReport(@Valid ReportCreateReqVO createReqVO);

    /**
     * 创建生产报工
     * @param reportDO
     * @return
     */
    Long saveReport(ReportDO reportDO);

    /**
     * 更新生产报工
     *
     * @param updateReqVO 更新信息
     */
    void updateReport(@Valid ReportUpdateReqVO updateReqVO);

    /**
     * 删除生产报工
     *
     * @param id 编号
     */
    void deleteReport(Long id);

    /**
     * 获得生产报工
     *
     * @param id 编号
     * @return 生产报工
     */
    ReportDO getReport(Long id);

    /**
     * 获得生产报工列表
     *
     * @param ids 编号
     * @return 生产报工列表
     */
    List<ReportDO> getReportList(Collection<Long> ids);

    /**
     * 获得生产报工分页
     *
     * @param pageReqVO 分页查询
     * @return 生产报工分页
     */
    PageResult<ReportDO> getReportPage(ReportPageReqVO pageReqVO);

    /**
     * 获得生产报工列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 生产报工列表
     */
    List<ReportDO> getReportList(ReportExportReqVO exportReqVO);

    /**
     * 查询各工序报工数量
     * @param id
     * @return
     */
    Map<Long, BigDecimal> getReportGroupByMoId(Long id);

    /**
     * 通过工单工艺路线查询报工
     * @param moRouteId
     * @return
     */
    List<ReportDO> getReportByMoRouteId(Long moRouteId);

    /**
     * 获取工单已报工总数量
     * @param id
     * @return
     */
    BigDecimal getCountByMoId(Long id);

    /**
     * 根据工单工艺路线查询报工数量
     * @param id
     * @return
     */
    BigDecimal getReportAmountByMoRouteId(Long id);

    /**
     * 通过流水号查询上道工序是否报工
     * @param moId
     * @param moRouteId
     * @param serialNo
     * @return
     */
    ReportDO getReportBySerialNo(Long moId, Long moRouteId, String serialNo);

    /**
     * 通过流水号查询所有报工记录
     * @param serialNo
     * @return
     */
    List<ReportDO> getReportBySerialNo(String serialNo);

    /**
     * 批量更新
     * @param reportList
     */
    void batchUpdateReport(List<ReportDO> reportList);

    /**
     * 查询未入库报工
     * @param factoryId
     * @param workshopId
     * @param timeArr
     * @return
     */
    List<ReportDO> getReportList(Long factoryId, Long workshopId, LocalDateTime[] timeArr);

    /**
     * 更新报工数据
     * @param erpProduceInId
     */
    void updateReportByErpInId(Long erpProduceInId);
}
